﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using vensoft.Entities;

namespace vensoft.DataAccess
{
    public class ProductoDataAccess: MasterDataAcess,IProductoDataAccess
    {
        public ProductoDataAccess() 
            :base()
        {
        }

        public List<Entities.Producto> GetAllFromProducto()
        {
            SqlCommand commando = base.CreateSelectCommand("GetAllFromProducto");
            return SelectObjectFactory(commando) ;
        }
        
        private List<Producto> SelectObjectFactory(SqlCommand commando)
        {
            List<Producto> lista = new List<Producto>();

            using (SqlDataReader reader = base.ExecuteReader(commando))
            {
                while (reader.Read())
                {
                    Producto producto = new Producto()
                    {
                        Id_Producto = reader.GetInt32(0),
                        Cod_Producto = reader.GetString(1),
                        Nombre = reader.GetString(2),
                        Precio = reader.GetDecimal(3),
                        Stock = reader.GetDouble(4),
                        id_Proveedor = reader.GetInt32(5),
                        Cod_Categoria = reader.GetInt32(7),
                        nombre_Categoria = reader.GetString(8)
                    };

                    lista.Add(producto);
                }
            }

            return lista;
        }

        public void EliminarProducto(Producto producto)
        {
            SqlCommand comand = base.CreateCommand("EliminarProducto");
            base.AddInParameter(comand, "Cod_Producto", producto.Cod_Producto);
            base.ExecuteCommand(comand);            
        }

        public void RegistrarProducto(Producto producto)
        {
            SqlCommand command = base.CreateCommand("RegistarProducto");
            AddParameterso(producto, command);            
            
        }
        
        private void AddParameterso(Producto producto, SqlCommand command)
        {
            base.AddInParameter(command, "Id_Producto", producto.Id_Producto);
            base.AddInParameter(command, "Cod_Producto", producto.Cod_Producto);
            base.AddInParameter(command, "Cod_Categoria", producto.Cod_Categoria);
            base.AddInParameter(command, "nombre_Cat", producto.nombre_Categoria);
            base.AddInParameter(command, "Nombre", producto.Nombre);
            base.AddInParameter(command, "Precio", producto.Precio);
            base.AddInParameter(command, "Stock", producto.Stock);
            base.AddInParameter(command, "id_Proveedor", producto.id_Proveedor);

            base.ExecuteCommand(command);
        }

        public List<Entities.Producto> GetFromProductoByNombre(string criterio)
        {
            SqlCommand command = base.CreateSelectCommand("GetFromProductoByNombre");
            command.Parameters.AddWithValue("@Nombre", criterio);
            return SelectObjectFactory(command);
        }

        List<Producto> IProductoDataAccess.GetFromProductoByIdAlmacen(int id)
        {
            SqlCommand command = base.CreateSelectCommand("GetFromProductoByAlmacen");
            command.Parameters.AddWithValue("@id_alm", id);
            return SelectObjectFactory(command);
        }

        public List<Producto> RetornarUltimoProducto()
        {
            SqlCommand command = base.CreateSelectCommand("RetornarUltimoProducto");            
            return SelectObjectFactory(command);
        }
    }
}
